TIM - Examen Pratique 2020-2021

Lundi 18 Janvier 2021

Partie Implémentation : Histogram Backprojection

Pour cet exercice, votre mission, si vous l'acceptez, sera d'implémenter l'algorithme "Histogram backprojection". Cet algorithme a été proposé par Michael J. Swain , Dana H. Ballard dans leur article "Indexing via color histograms" en 1990.

Cet algorithme est utilisé principalement pour de la segmentation d'image ou pour de la détection d'objets. A partir d'une image et d'une région d'intérêt (Region Of Interest ou ROI), l'histogram backprojection retourne une image de la même taille où chaque pixel correspond à la probabilité que ce pixel appartienne à la région d'intérêt. Cette image est créée grâce à l'analyse des histogrammes 2D de l'image d'entrée et de la ROI, converties en HSV.

La tâche qu'on va réaliser avec histogram backprojection est la segmentation d'images, à savoir la création d'une matrice de même taille que l'image d'entrée, où chaque pixel contient comme valeur la classe de l'objet (exemple en image ci-dessous). Cependant, avec notre algo, on va uniquement segmenter une zone d'intérêt, donc une seule classe d'objet.

Partie 1 : Roses are red, Violets are blue...


1) Chargez l'image (rose.png) et la ROI (rose_roi.png) en RGB pour la démonstration et affichez-les.

Vous l'avez compris : l'objectif sera de détecter les têtes de roses rouges. La ROI est une zone extraite de l'image (au centre).


2) Convertissez l'image et la ROI en HSV et affichez les résultats channel par channel (en niveau de gris)


3) Calculez maintenant les histogrammes 2D de l'image HSV et la ROI HSV, qui s'appeleront respectivement I et M. L' histogramme 2D d'une image est une matrices 2D avec en abscisse les valeurs possibles de l'image sur le channel H, et en ordonnée les valeurs possibles de l'image sur le channel S.

Vous pouvez soit coder la fonction à la main, soit utiliser une fonction qui permet de le calculer.

Checkpoint 1 : Vous pouvez vérifier que votre histogramme est correct grâce aux vérifications suivantes :

Si ce checkpoint n'est pas validé, vous avez en secours les matrices I.npy et M.npy à charger dans le dossier 'Base_images/voie_de_secours/'


4) Calculez la matrice de probabilités R = M/I. Il se peut que vous ayez des valeurs incongrues, mais c'est normal, car I peut valoir 0 parfois. Cela n'influencera pas les résultats futurs, mais remplacez ces valeurs par 0.


5) R ici va être utilisée ensuite comme une 'palette'. On va pouvoir construire la matrice B, une image 1 channel de la même taille que notre image à analyser, dont chaque pixel aura comme valeur la probabilité que ce pixel soit de la même classe que la région d'intérêt.

Construisez et affichez maintenant la matrice B, définie grâce à la formule suivante :

\begin{equation*} B(x,y) = min(R[h(x,y),s(x,y)],1) \end{equation*}

avec h et s qui sont respectivement les channels Hue et Saturation de l'image à analyser.

Checkpoint 2 : A ce stade, il se peut que vous n'obtenez pas un résultat satisfaisant (à base d'erreurs d'exécution, ou autre, etc.). Pour cela, vous avez la possibilité d'utiliser la fonction OpenCV calcBackProject, où il vous faudra votre image HSV à analyser, et M, l'histogramme de votre ROI en format HSV.

/!\ : Il est fort probable que vous n'ayez pas le même résultat que la version d'OpenCV. Ceci est normal car nous effectuons pas exactement les mêmes opérations que l'algo d'OpenCV. Cependant, l'algorithme d'OpenCV retourne une matrice en uint8, donc il faudra normaliser le résultat pour avoir des valeurs comprises entre 0 et 1.


6) Il est l'heure d'appliquer un filtrage sur B. Pour cela, créer un filtre elliptique de taille 5X5 (utilisé habituellement pour la morphologie mathématique), appliquez ce filtre via convolution sur B, normalisez le résultat en uint8 et affichez le résultat.


7) Pour finir, appliquez une binarisation sur cette image pour obtenir un masque indiquant les pixels appartenant à la classe de votre ROI. Le seuil sera défini à la main. Affichez le résultat de cette binarisation.

Partie 2 : Cassiopée, apprentie influenceuse insta

Cassiopée a un seul objectif : percer sur Insta. Cependant, elle n'a pas encore assez de notorieté pour pouvoir avoir de nombreux partenariats et faire des placements de produits. Elle n'a donc pass asez d'argent pour pouvoir réaliser un shooting photo sur les plages de Dubaï et est donc coincée dans le Poitou-Charentes.

A partir de ce que vous avez implémenté précédemment, appliquez l'histogram backprojection sur la dernière photo de Cassiopée, allongée dans l'herbe (Cassiopee.jpg), et envoyez la à Dubaï avec un subtil montage photo grâce au fond disponible ("Dubai.jpg").

Indice : Cassiopée est difficile à segmenter... Il faudrait peut-être segmenter tout sauf Cassiopée...

Morales de l'histoire :


Rendu

Le rendu qui vous est demandé est le notebook. Vous le déposerez en fin d'examen sur Moodle, dans un dépot prévu à cet effet, dans le format NOM_Prenom_P1.ipynb